using System;
using System.Collections.Generic;
using System.Data;

using PMServiceDesk.DataType;
using PMServiceDesk.Utils.ManejoDatos;

namespace PMServiceDesk.DataAccess
{
    public class ActividadData
    {
        #region Variables

        private string _select;
        private string _join;
        private string _where;
        private int _totalRegistros = 0;

        private Dictionary<string, object> _parametrosConsulta;

        #endregion

        #region Propiedades

        protected string Where
        {
            get
            {
                if (_where == "") return "";

                return "WHERE " + _where.Substring(3);
            }
        }

        #endregion

        #region Constructores

        public ActividadData()
        {
            this._limpiarConsulta();
        }

        #endregion

        #region Metodos

        private void _limpiarConsulta()
        {
            _select = "";
            _join = "";
            _where = "";
            _parametrosConsulta = new Dictionary<string, object>();
        }

        private DataUtil _consultaDataReader(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            DataUtil data = null;

            if(paginaActual==0)
                data = new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, _select + _join + this.Where + orderBy,_parametrosConsulta);
            else
                data = DataReader.ReturnPagingReader(TypeDataBase.PMServiceDesk, _select, _join, this.Where, this._parametrosConsulta, paginaActual, cantidadMostrar, orderBy, ref _totalRegistros);

            this._limpiarConsulta();

            return data;
        }

        public void Grabar(ActividadType actividad)
        {
            using (DataUtil d = this._grabar())
            {
                d.AddParameter("@ID", (actividad.Id == null ? "0" : actividad.Id));
                d.AddParameter("@PAQUETETRABAJOID", actividad.PaqueteTrabajoId);
                d.AddParameter("@ESTADOPAQUETETRABAJOID", actividad.EstadoPaqueteTrabajoId);
                d.AddParameter("@USUARIORESPONSABLEID", actividad.UsuarioResponsableId);
                d.AddParameter("@CODIGOCUENTA", actividad.CodigoCuenta);
                d.AddParameter("@NOMBRE", actividad.Nombre);
                d.AddParameter("@FECHAINICIO", ConvertFormat.Char_To_DateOrNull(actividad.FechaInicio));
                d.AddParameter("@FECHAFIN", ConvertFormat.Char_To_DateOrNull(actividad.FechaFin));
                d.AddParameter("@PORCENTAJEPESO", actividad.PorcentajePeso);
                d.AddParameter("@PORCENTAJEAVANCE", actividad.PorcentajeAvance);

                actividad.Id = d.ExecuteScalar(true).ToString();
            }
        }

        public void Eliminar(string id)
        {
            using (DataUtil d = this._eliminar())
            {
                d.AddParameter("@ID", id);

                d.ExecuteNonQuery();
            }
        }

        public ActividadType Cargar()
        {
            List<ActividadType> l = this.CargarLista();

            if (l.Count == 0) return null;

            return l[0];
        }


        public ActividadType CargarVista()
        {
            List<ActividadType> l = this.CargarListaVista();

            if (l.Count == 0) return null;

            return l[0];
        }

        public List<ActividadType> CargarLista()
        {
            List<ActividadType> l = new List<ActividadType>();

            using (DataUtil d = this._consultaCargar())
                using (IDataReader r = d.ExecuteReader())
                {
                    ActividadType o = null;

                    while (r.Read())
                    {
                        o = new ActividadType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.PaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("PAQUETETRABAJOID")).ToString();
                        o.EstadoPaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOID")).ToString();
                        o.EstadoPaqueteTrabajo = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJO")).ToString();
                        o.UsuarioResponsableId = r.GetValue(d.GetOrdinalReader("USUARIORESPONSABLEID")).ToString();
                        o.UsuarioResponsable = r.GetValue(d.GetOrdinalReader("USUARIORESPONSABLE")).ToString();
                        o.CodigoCuenta = r.GetValue(d.GetOrdinalReader("CODIGOCUENTA")).ToString();
                        o.Nombre = r.GetValue(d.GetOrdinalReader("NOMBRE")).ToString();
                        o.FechaInicio = ConvertFormat.Date_To_Char(r.GetValue(d.GetOrdinalReader("FECHAINICIO")));
                        o.FechaFin = ConvertFormat.Date_To_Char(r.GetValue(d.GetOrdinalReader("FECHAFIN")));
                        o.PorcentajePeso = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("PORCENTAJEPESO")));
                        o.PorcentajePeso_Format = ConvertFormat.Decimal_To_Char(o.PorcentajePeso) + " %";
                        o.PorcentajeAvance = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("PORCENTAJEAVANCE")));
                        o.PorcentajeAvance_Format = ConvertFormat.Decimal_To_Char(o.PorcentajeAvance) + " %";

                        l.Add(o);
                    }
                }

            return l;
        }

        public List<ActividadType> CargarListaVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            List<ActividadType> l = new List<ActividadType>();

            using (DataUtil d = this._consultaCargarVista(paginaActual, cantidadMostrar,orderBy))
                using (IDataReader r = d.ExecuteReader())
                {
                    ActividadType o = null;

                    while (r.Read())
                    {
                        o = new ActividadType();

                        o.Id = r.GetValue(d.GetOrdinalReader("ID")).ToString();
                        o.PaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("PAQUETETRABAJOID")).ToString();
                        o.EstadoPaqueteTrabajoId = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJOID")).ToString();
                        o.EstadoPaqueteTrabajo = r.GetValue(d.GetOrdinalReader("ESTADOPAQUETETRABAJO")).ToString();
                        o.UsuarioResponsableId = r.GetValue(d.GetOrdinalReader("USUARIORESPONSABLEID")).ToString();
                        o.UsuarioResponsable = r.GetValue(d.GetOrdinalReader("USUARIORESPONSABLE")).ToString();
                        o.CodigoCuenta = r.GetValue(d.GetOrdinalReader("CODIGOCUENTA")).ToString();
                        o.Nombre = r.GetValue(d.GetOrdinalReader("NOMBRE")).ToString();
                        o.FechaInicio = ConvertFormat.Date_To_Char(r.GetValue(d.GetOrdinalReader("FECHAINICIO")));
                        o.FechaFin = ConvertFormat.Date_To_Char(r.GetValue(d.GetOrdinalReader("FECHAFIN")));
                        o.PorcentajePeso = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("PORCENTAJEPESO")));
                        o.PorcentajePeso_Format = ConvertFormat.Decimal_To_Char(o.PorcentajePeso) + " %";
                        o.PorcentajeAvance = Convert.ToDecimal(r.GetValue(d.GetOrdinalReader("PORCENTAJEAVANCE")));
                        o.PorcentajeAvance_Format = ConvertFormat.Decimal_To_Char(o.PorcentajeAvance) + " %";

                        l.Add(o);
                    }
                }

            if (l.Count <= _totalRegistros) l.Capacity = _totalRegistros;

            return l;
        }

        #endregion

        #region SQL

        private DataUtil _grabar()
        {
            string sql = @"IF(NOT EXISTS(SELECT 1 FROM ACTIVIDAD WHERE ID=@ID)) 
                           BEGIN
                               INSERT INTO ACTIVIDAD
                               (
                                   PAQUETETRABAJOID
                                  ,ESTADOPAQUETETRABAJOID
                                  ,USUARIORESPONSABLEID
                                  ,CODIGOCUENTA
                                  ,NOMBRE
                                  ,FECHAINICIO
                                  ,FECHAFIN
                                  ,PORCENTAJEPESO
                                  ,PORCENTAJEAVANCE
                               )
                               VALUES
                               (
                                   @PAQUETETRABAJOID
                                  ,@ESTADOPAQUETETRABAJOID
                                  ,@USUARIORESPONSABLEID
                                  ,@CODIGOCUENTA
                                  ,@NOMBRE
                                  ,@FECHAINICIO
                                  ,@FECHAFIN
                                  ,@PORCENTAJEPESO
                                  ,@PORCENTAJEAVANCE
                               )

                               SELECT @@IDENTITY
                           END
                           ELSE
                           BEGIN
                               UPDATE ACTIVIDAD SET
                               PAQUETETRABAJOID=@PAQUETETRABAJOID
                              ,ESTADOPAQUETETRABAJOID=@ESTADOPAQUETETRABAJOID
                              ,USUARIORESPONSABLEID=@USUARIORESPONSABLEID
                              ,CODIGOCUENTA=@CODIGOCUENTA
                              ,NOMBRE=@NOMBRE
                              ,FECHAINICIO=@FECHAINICIO
                              ,FECHAFIN=@FECHAFIN
                              ,PORCENTAJEPESO=@PORCENTAJEPESO
                              ,PORCENTAJEAVANCE=@PORCENTAJEAVANCE
                               WHERE ID=@ID

                               SELECT @ID
                           END";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _eliminar()
        {
            string sql = @"DELETE FROM ACTIVIDAD WHERE ID=@ID";

            return new DataUtil(TypeDataBase.PMServiceDesk, CommandType.Text, sql);
        }

        private DataUtil _consultaCargar()
        {
            _select = @"SELECT
                        AC.ID
                        ,AC.PAQUETETRABAJOID
                        ,AC.ESTADOPAQUETETRABAJOID
                        ,ESTPAQ.NOMBRE						AS ESTADOPAQUETETRABAJO
                        ,AC.USUARIORESPONSABLEID
                        ,RECRES.NOMBRE						AS USUARIORESPONSABLE
                        ,AC.CODIGOCUENTA
                        ,AC.NOMBRE
                        ,AC.FECHAINICIO
                        ,AC.FECHAFIN
                        ,AC.PORCENTAJEPESO
                        ,AC.PORCENTAJEAVANCE
                        ";

            _join = @"FROM DBO.ACTIVIDAD [AC] 
                    INNER JOIN PAQUETETRABAJO [PAQ] ON PAQ.ID = AC.PAQUETETRABAJOID
                    INNER JOIN ESTADOPAQUETETRABAJO [ESTPAQ] ON ESTPAQ.ID = AC.ESTADOPAQUETETRABAJOID
                    INNER JOIN USUARIORECURSO [USURES] ON USURES.USUARIOID = AC.USUARIORESPONSABLEID
                    INNER JOIN RECURSO [RECRES] ON RECRES.ID = USURES.RECURSOID AND RECRES.PROYECTOID = PAQ.PROYECTOID
                      ";

            return this._consultaDataReader();
        }

        private DataUtil _consultaCargarVista(int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _select = @"SELECT
                        AC.ID
                        ,AC.PAQUETETRABAJOID
                        ,AC.ESTADOPAQUETETRABAJOID
                        ,ESTPAQ.NOMBRE						AS ESTADOPAQUETETRABAJO
                        ,AC.USUARIORESPONSABLEID
                        ,RECRES.NOMBRE						AS USUARIORESPONSABLE
                        ,AC.CODIGOCUENTA
                        ,AC.NOMBRE
                        ,AC.FECHAINICIO
                        ,AC.FECHAFIN
                        ,AC.PORCENTAJEPESO
                        ,AC.PORCENTAJEAVANCE
                        ";

            _join = @"FROM DBO.ACTIVIDAD [AC] 
                    INNER JOIN PAQUETETRABAJO [PAQ] ON PAQ.ID = AC.PAQUETETRABAJOID
                    INNER JOIN ESTADOPAQUETETRABAJO [ESTPAQ] ON ESTPAQ.ID = AC.ESTADOPAQUETETRABAJOID
                    INNER JOIN USUARIORECURSO [USURES] ON USURES.USUARIOID = AC.USUARIORESPONSABLEID
                    INNER JOIN RECURSO [RECRES] ON RECRES.ID = USURES.RECURSOID AND RECRES.PROYECTOID = PAQ.PROYECTOID
                      ";

            return this._consultaDataReader(paginaActual, cantidadMostrar, orderBy);
        }

        public void FiltrarPorId(string id)
        {
            _where += @"AND AC.ID=@ID
                                 ";

            _parametrosConsulta.Add("@ID", id);
        }
        public void FiltrarPorPaqueteTrabajoId(string paqueteTrabajoId)
        {
            _where += @"AND AC.PAQUETETRABAJOID=@PAQUETETRABAJOID
                                 ";

            _parametrosConsulta.Add("@PAQUETETRABAJOID", paqueteTrabajoId);
        }
        public void FiltrarPorEstadoPaqueteTrabajoId(string estadoPaqueteTrabajoId)
        {
            _where += @"AND AC.ESTADOPAQUETETRABAJOID=@ESTADOPAQUETETRABAJOID
                                 ";

            _parametrosConsulta.Add("@ESTADOPAQUETETRABAJOID", estadoPaqueteTrabajoId);
        }
        public void FiltrarPorUsuarioResponsableId(string usuarioResponsableId)
        {
            _where += @"AND AC.USUARIORESPONSABLEID=@USUARIORESPONSABLEID
                                 ";

            _parametrosConsulta.Add("@USUARIORESPONSABLEID", usuarioResponsableId);
        }
        public void FiltrarPorCodigoCuenta(string codigoCuenta)
        {
            _where += @"AND AC.CODIGOCUENTA LIKE '%' + @CODIGOCUENTA + '%'
                                 ";

            _parametrosConsulta.Add("@CODIGOCUENTA", codigoCuenta);
        }
        public void FiltrarPorNombre(string nombre)
        {
            _where += @"AND AC.NOMBRE LIKE '%' + @NOMBRE + '%'
                                 ";

            _parametrosConsulta.Add("@NOMBRE", nombre);
        }
        public void FiltrarPorFechaInicio(DateTime fechaInicio)
        {
            _where += @"AND CAST(AC.FECHAINICIO AS DATE) = @FECHAINICIO
                                 ";

            _parametrosConsulta.Add("@FECHAINICIO", fechaInicio);
        }
        public void FiltrarPorFechaFin(DateTime fechaFin)
        {
            _where += @"AND CAST(AC.FECHAFIN AS DATE) = @FECHAFIN
                                 ";

            _parametrosConsulta.Add("@FECHAFIN", fechaFin);
        }


        #endregion
    }
}
